#ifndef _LINKED_LIST_H_
#define _LINKED_LIST_H_

#include <stddef.h>

// 循环链表节点定义
typedef struct LNode {
  void *data;          // 数据
  struct LNode *next;  // 下一个节点
  struct LNode *prior; // 上一个节点
} LNode;

// 循环链表
typedef struct LinkList {
  LNode *head_ptr; // 头节点
  LNode *tail_ptr; // 尾节点
  size_t size;     // 每个节点数据大小
  size_t nmemb;    // 节点数量
} LList;

typedef int (*cmp_t)(const void *data, const void *key);

typedef void (*pri_t)(const void *data);

int list_init(LList **list, const size_t size);

static LNode *__create_node(const void *data, size_t size);

int list_insert(LList *list, size_t index, const void *new_data);

int list_insert_front(LList *list, const void *new_data);

int list_insert_back(LList *list, const void *new_data);

void *list_get_data(const LList *list, size_t index);

int list_del_by_data(LList *list, const void *key, cmp_t cmp);
int list_del_by_index(LList *list, size_t index);

int list_mod(LList *list, size_t index, void *new_data);

void *list_search(const LList *list, const void *key, cmp_t cmp);

void list_traval(const LList *list, pri_t pri);

void list_destory(LList **list);
void list_reverse(LList *list);

#endif // !_LINKED_LIST_
